﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Entities;
using System.ComponentModel;
using Cesave.Domain.PermisosModule.Contracts.CultivosClasificaciones;
using Cesave.Infrastructure.CrossCutting.IoC;
using System.Windows.Forms;
using Cesave.Domain.Core.Entities;

namespace Cesave.DistributedServices.PermisosModule.WindowsHost.ViewModels.Catalogs.Cultivos
{
	/// <summary>
	/// Controlador de las clasificaciones de cultivo.
	/// </summary>
	public partial class CultivosViewModel
	{
		#region Private properties

		/// <summary>
		/// Clasificaciones de cultivo.
		/// </summary>
		private List<CultivoClasificacion> _clasificaciones;

		/// <summary>
		/// Clasificación del cultivo.
		/// </summary>
		private CultivoClasificacion _clasificacion;

		#endregion

		#region Public properties

		/// <summary>
		/// Clasificaciones de cultivo.
		/// </summary>
		public List<CultivoClasificacion> Clasificaciones
		{
			get
			{
				return _clasificaciones;
			}
			private set
			{
				_clasificaciones = value;
				if (_clasificaciones != null)
					RaisePropertyChanged("Clasificaciones");
			}
		}

		/// <summary>
		/// Clasificación de cultivo.
		/// </summary>
		public CultivoClasificacion Clasificacion
		{
			get
			{
				return _clasificacion;
			}
			private set
			{
				_clasificacion = value;
				RaisePropertyChanged("Clasificacion");
			}
		}

		#endregion

		#region Private methods

		/// <summary>
		/// Carga las clasificaciones de cultivo en la vista.
		/// </summary>
		private void LoadClasificaciones()
		{
			// Iniciamos la barra de espera.
			StartWaiting();
			// Toda la operación la manejamos desde otro thread
			using (BackgroundWorker worker = new BackgroundWorker())
			{
				worker.DoWork += (sender, e) =>
				{
					// Obtenemos la referencia al servicio de clasificaciones.
					ICultivoClasificacionService service = IoCFactory.Resolve<ICultivoClasificacionService>();
					// Cargamos las clasificaciones de cultivo al resultado del evento.
					e.Result = service.FindAllCultivoClasificaciones();
				};
				worker.RunWorkerCompleted += (sender, e) =>
				{
					// Detemos la barra de espera
					EndWaiting();
					// Si el evento no fue cancelado y no ocurrió ningún error,
					// entonces cargamos el resultado a la propiedad correspondiente
					if (!e.Cancelled && e.Error == null)
						/// Ésta declaración hará que se dispare el evento PropertyChanged
						/// el cual, dependiendo de la propiedad que se modifique ejecutará
						/// determinado método
						/// <see cref="CultivosViewModel_PropertyChanged" />
						Clasificaciones = e.Result as List<CultivoClasificacion>;
					else if (e.Error != null)
						// Mostramos el mensaje del error
						ShowMessage(e.Error.Message);
				};
				worker.WorkerSupportsCancellation = true;
				// Corremos el thread.
				worker.RunWorkerAsync();
			}
		}

		#endregion

		#region Event methods

		/// <summary>
		/// Identifica la clasificación de cultivo actualmente seleccionada
		/// en la vista (cutlivosClasificacionesBindingSource)
		/// </summary>
		/// <param name="sender">
		/// BindingSource que contiene las clasificaciones de cultivo.
		/// </param>
		/// <param name="e"></param>
		private void SetCurrentClasificacion(object sender, EventArgs e)
		{
			BindingSource bindingSource = sender as BindingSource;
			if (bindingSource != null && bindingSource.Current != null)
				/// Ésta asignación hará que se dispare el evento PropertyChanged
				/// el cual, dependiendo de la propiedad que se modifique, ejecutará
				/// determinado método.
				Clasificacion = bindingSource.Current as CultivoClasificacion;
		}

		/// <summary>
		/// Se ejecuta al asignarle algún valor a la propiedad Clasificaciones
		/// del modelo de la vista (controlador).
		/// </summary>
		private void OnClasificacionesPropertyChanged()
		{
			// Asignamos el valor de Clasificaciones al BindingSource de la vista
			_view.cultivoClasificacionesBindingSource.DataSource = Clasificaciones;
			_view.cultivoClasificacionesBindingSource.CurrentChanged += SetCurrentClasificacion;
			SetCurrentClasificacion(_view.cultivoClasificacionesBindingSource, new EventArgs());
		}

		/// <summary>
		/// Se ejecuta al asignarle algún valor a la propiedad Clasificacion
		/// del modelo de la vista (controlador).
		/// </summary>
		private void OnClasificacionPropertyChanged()
		{
			if (IsCultivoReady)
			{
				Cultivo.ClasificacionId = Clasificacion.ClasificacionId;
				Cultivo.MarkAsModified();
			}
		}

		#endregion

	}
}
